/*!
 * \file WtStraDualThrust.h
 * \project WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief WonderTrader DualThrust双推策略头文件
 * 
 * \details 该文件定义了WtStraDualThrust类，实现经典的DualThrust双推策略：
 *          
 *          策略原理：
 *          - 基于历史价格区间的突破策略
 *          - 计算上轨：最低价 + K1 * (最高价 - 最低价)
 *          - 计算下轨：最高价 - K2 * (最高价 - 最低价)
 *          - 价格突破上轨做多，突破下轨做空
 *          
 *          策略特点：
 *          - 趋势跟踪策略，适合有明显趋势的市场
 *          - 双向交易，可同时做多做空
 *          - 参数化配置，支持不同市场调优
 *          - 自适应的动态轨道计算
 *          
 *          适用场景：
 *          - 期货市场的日内或日间交易
 *          - 股票市场的趋势跟踪
 *          - 任何具有足够波动性的金融产品
 */

#pragma once
#include "../Includes/CtaStrategyDefs.h"

/*!
 * \class WtStraDualThrust
 * \brief DualThrust双推策略实现
 * 
 * \details 该类实现了经典的DualThrust策略算法，继承自CtaStrategy基类：
 *          
 *          核心算法：
 *          1. 收集最近N天的OHLC数据
 *          2. 计算历史价格区间：Range = 最高价 - 最低价
 *          3. 计算今日交易边界：
 *             - 上轨 = 今日开盘价 + K1 * Range
 *             - 下轨 = 今日开盘价 - K2 * Range
 *          4. 价格突破判断与交易执行
 *          
 *          参数说明：
 *          - K1: 上轨系数，控制做多入场的敏感度
 *          - K2: 下轨系数，控制做空入场的敏感度
 *          - days: 历史数据天数，影响区间计算的稳定性
 *          - period: K线周期，支持分钟线和日线
 *          - count: K线数量，用于数据获取
 *          
 *          交易逻辑：
 *          - 价格 > 上轨：平空开多
 *          - 价格 < 下轨：平多开空
 *          - 支持股票和期货两种交易模式
 * 
 * \note 该策略适合有明显趋势特征的市场环境
 * \warning 在震荡市场中可能产生频繁的假突破
 * \see CtaStrategy, ICtaStraCtx
 */
class WtStraDualThrust : public CtaStrategy
{
public:
	/*!
	 * \brief 构造函数
	 * \param id 策略实例唯一标识符
	 */
	WtStraDualThrust(const char* id);
	
	/*!
	 * \brief 析构函数
	 */
	virtual ~WtStraDualThrust();

public:
	/*!
	 * \brief 获取策略工厂名称
	 * \return 工厂名称字符串
	 */
	virtual const char* getFactName() override;

	/*!
	 * \brief 获取策略名称
	 * \return 策略名称字符串（"DualThrust"）
	 */
	virtual const char* getName() override;

	/*!
	 * \brief 初始化策略
	 * \param cfg 配置参数对象
	 * \return 初始化成功返回true，失败返回false
	 * 
	 * \details 从配置文件中读取策略参数：
	 *          - k1, k2: 上下轨系数
	 *          - days: 历史数据天数
	 *          - period: K线周期
	 *          - count: K线数量
	 *          - code: 交易合约代码
	 *          - stock: 是否为股票模式
	 */
	virtual bool init(WTSVariant* cfg) override;

	/*!
	 * \brief 策略调度事件
	 * \param ctx 策略上下文
	 * \param curDate 当前日期
	 * \param curTime 当前时间
	 * 
	 * \details 定时调度事件，可用于日内定时操作或收盘后的数据处理
	 */
	virtual void on_schedule(ICtaStraCtx* ctx, uint32_t curDate, uint32_t curTime) override;

	/*!
	 * \brief 策略初始化事件
	 * \param ctx 策略上下文
	 * 
	 * \details 策略启动时调用，用于订阅数据和初始化状态
	 */
	virtual void on_init(ICtaStraCtx* ctx) override;

	/*!
	 * \brief Tick数据事件
	 * \param ctx 策略上下文
	 * \param stdCode 标准合约代码
	 * \param newTick 新的Tick数据
	 * 
	 * \details 接收到新Tick数据时调用，执行核心交易逻辑：
	 *          - 获取历史K线数据
	 *          - 计算DualThrust上下轨
	 *          - 判断价格突破并执行交易
	 */
	virtual void on_tick(ICtaStraCtx* ctx, const char* stdCode, WTSTickData* newTick) override;

private:
	//指标参数
	double		_k1;		/*!< 上轨系数，用于计算做多入场点 */
	double		_k2;		/*!< 下轨系数，用于计算做空入场点 */
	uint32_t	_days;		/*!< 历史数据天数，用于计算价格区间 */

	//周期参数
	std::string _period;	/*!< K线周期字符串（如"m1", "m5", "d1"） */
	//K线条数
	uint32_t	_count;		/*!< 获取K线的数量 */

	//合约代码
	std::string _code;		/*!< 交易的合约代码 */

	bool		_isstk;		/*!< 是否为股票交易模式 */
};

